import org.junit.Test;

import java.util.Locale;
import java.util.Scanner;

/**
 * 常量池
 * String存在常量池[内存--JVM--堆]------>好处：减少内存开销
 * Java为了提高性能，静态字符串（字面量/常量/常量链接结果）
 * 在常量池中创建，并且使用同一个对象，重用静态字符串
 * 对于重复出现字符串直接量，JVM虚拟机会从常量池中进行获取
 * 如果查找到，返回改对象
 *
 */
public class Demo {
    @Test
    public void testString1(){
        String s1="java123";//常量池：S1的值保存常量值，取常量池
        String s2="java123";//常量池：S2拿到的是S1的值
        System.out.println(s1==s2);
        String s3="java"+"123";
        System.out.println(s1==s3);
        //+  代表拼接字符串  JVM虚拟机对于字符串做优化：右侧字面量形式自动计
        //计算后结果，通过引用进入堆内存中，找常量池中存在：Java123死值
        //s3重用s1的对象
        String s="java";
        String s4=s+"123";//新对象 ，无法从常量池中获取
        //JVM虚拟机进行优化：引用对象+字面量，不可以进行计算
        System.out.println(s1==s4);//false
        String s5=new String("java123");//引用类型
        //new出来的对象，全新对象
        System.out.println(s1==s5);//常量池：Java123==对象：Java123
    }
    /**
     * String API 常用方法
     * length（）方法  返回值：int
     * 用法：返回当前字符串长度（个数）
     * 字符串：包括空格、字符、汉字、....
     * String 类采用Unicode编码集：一个字符，占两个字节
     *
     *
     *
     *
     */
    @Test
    public void testLength(){
        String s="hello";//占10个字节，使用length从1开始
        System.out.println(s.length());
        String s1="我爱java";//去掉空格 空格占字符
        System.out.println(s1.length());
    }
    /**
     * String API常用方法
     * indexOf方法【重点：重载】
     * 用法：查找指定字符串中，首次出现的位置【下标位置】
     *      如果没有查到，返回-1
     *      indexOf（”字符“，字符串位置）
     *   用法：查找到指定字符串位置的首次出现【下标位置】
     *   例如：woniwoniwo   查找相同字符的下一位
     */
    @Test
    public void testIndexOf(){
        String str="thinking in java";
        int index=str.indexOf("in");
        System.out.println("返回坐标位置："+index);
        //重载方法：方法名相同参数不同
        //indexOf(”查找字符串“，字符串位置)
        //功能：从指定位置下进行查找，下一个in的位置

        index=str.indexOf("in",3);
        System.out.println("返回坐标位置："+index);
        //5    下标位置：往后一位查找     第二次出现in的位置
    }
    /**
     * String API方法
     * lastIndexOf("字符")
     * 用法：找到字符串中包含“字符”的最后一次出现位置【下标位置】
     */
    @Test
    public void testLastIndexOf(){
        String s="thinking in java";
        int index=s.lastIndexOf("n");
        System.out.println("最后出现的位置："+index);
    }
    /**
     * [重点]
     * subString(int start,int end)方法   返回值：String
     * 用法：截取字符串,从start处开始截取到end【口诀：含头不含尾】
     * www.baidu.com
     * subString(int start）方法    返回值：String
     * 用法：截取字符串，从start处开始截取，没有end，直接截取到最后
     *
     */
    @Test
    public void testSubString(){
        String url="www.baidu.com";
        //需求：获取当前字符串中：baidu.子字符串
        String s=url.substring(4,10);
        System.out.println("截取后的子字符串"+s);
        //需求：获取当前url字符串中：baidu.com
        String s1=url.substring(4);
        System.out.println("截取到最后字符串："+s1);

    }
    /**
     * trim（）
     * 用法：去掉字符串中两边空格
     * 验证码： X34d     解决并发问题【延迟操作】
     *
     *
     */
    @Test
    public void testTrim(){
        String str="X34d";//字节：12个，空格算
        str=str.trim();//覆盖：不写前面数据类型
        System.out.println(str);
    }
    /**
     * charAt(int index)
     * 用法：返回字符串中对应下标的字符
     *产生异常：StringIndexOutOfBoundsException
     *         字符串下标越界异常
     *  产生原因：下标超出字符串实际下标数
     */
    @Test
    public void testCharAt(){
        String str="thinking in java";//java编程思想 第四版
        char c=str.charAt(2);
        System.out.println("获取的字符是："+c);

    }
    /**
     * 验证码： X34d    统一转换为小大写：判断
     * toUpperCase()   字符串转换为大写
     * toLowerCase()   字符串转换为小写
     */
    @Test
    public void testUL(){
        String str="X34d";//判断：大小写分明   需求：去空格，转大小写
        str=str.toLowerCase().trim();
        System.out.println("转换为小写："+str);
        str=str.toUpperCase().trim();
        System.out.println("转换为大写："+str);
    }
    /**【重点：servlet--javabean获取数据类库中数据】
     * 静态方法：通过类名直接调用方法
     * valueOf(基础数据类型的引用)     返回值：String
     * 用法：将Java中基础数据类型转换为字符串
     *
     */
    @Test
    public void testValueOf(){
        int i=123;
       String s=String.valueOf(i);
        //验证：当前s对象是否等于“123”    equals（）默认：对比对象，死值对比死值
        if(s.equals("123")){//字面量.equals（字面量），按照实际值判断
            System.out.println("是字符串，转换成功~");
    }else{
            System.out.println("不是字符串，转换失败");}
    }

    /**正则表达式：匹配【验证】字符串---不作为重点【了解：PHP】
     * 过滤字符串中数值正则写法：^[0-9]*$--------JavaScript【重点】
     * matches()方法       返回值：boolean
     * 作用：用于字符串验证，通过正则表达式进行验证【过滤字符】
     */

    public static void main(String[] args) {


        String regex="^[0-9]*$";//验证数值
        System.out.println("请输入：");
        Scanner input=new Scanner(System.in);//从控制台输入：用来测试
        //验证：从控制台输入数值，matches方法验证是否是数值
        if (input.nextLine().matches(regex)){
            System.out.println("是数字");
        }else{
            System.out.println("不是数字");

        }

    }
    /**
     *
     *  replace(String a,String b)方法返回值String[子字符串]
     * 第一个参数:String a要被替换的子串
     * 第二个参数:String b用于替换的新字符串
     * 作用:用于替换字符串中特定子串
     */

    @Test


    public void testReplace() {
     String url = "www.baidu.com";
     url.replace("baidu", "zyf");//覆盖
     System.out.println("替换子字符串：" + url);
     }
     /**
      *  replaceAll(正则，过滤效果) 替换字符串
      *  作用：替换所有字符串的内容，支持正则
      */
    @Test
    public void textAll() {
     String regex = "^[\\u4e00-\\u9fa5]{0,}$";
     String str = "字符串";
     //str.replaceAll(regex,"***");//支持正则
     str.replace(regex, "***");//不支持正则
     System.out.println("支持正则:" + str);
     }
    /**
     * split()    返回值String[]     返回数组----遍历
     * 作用：按照正则或者字符串方式分割字符串
     *   正则特殊表达含义  ：匹配到一个字符
     *   需求：www.baidu.com按照点的方式分割url地址
     *\\.代表.
     *
     * 需求：www.baidu.com按照点的方式分割url地址
     */
    @Test
    public void testSplit(){
        String url="www.baidu.com";
        String[] str=url.split("\\.");
        //增强for 遍历 str 字符串数组
        for(String s:str){//接收类型：字符串数组引用
            System.out.println("切割后子字符串："+s);
        }
        System.out.println(str[1]);
    }
    //查API---split方法--数组下标越界
    //String字符串：重点：替换、截取【需要知道下标】、分割【获取部分子字符串】
    //StringBuilder与StringBuffer   【方法完全一致，功能：追加、插入、替换】
    // 解决：String类拼接【不需要用+】内存溢出--硬盘--程序会卡
    //“123”+“456”+“789”    牵扯拼接，建议SB
    /**笔试题：
     * StringBuilder与StringBuffer的区别
     *
     * StringBuilder---JDK1.5--不考虑线程安全【程序效率高】
     * StringBuffer---JDK1.0--考虑线程安全【程序效率低】
     *
     * 其他用法一致
     */



}
